/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.gov.fasepa.sgpf.bean;

import br.gov.fasepa.sgpf.entity.Servidor;
import br.gov.fasepa.sgpf.entity.Setor;
import br.gov.fasepa.sgpf.entity.Unidade;
import br.gov.fasepa.sgpf.rn.ServidorRN;
import br.gov.fasepa.sgpf.rn.SetorRN;
import br.gov.fasepa.sgpf.rn.UnidadeRN;
import br.gov.fasepa.sgpf.util.JsfUtil;
import br.gov.fasepa.sgpf.util.SystemUtil;
import br.gov.fasepa.sgpf.util.Validator;
import java.io.IOException;
import java.io.Serializable;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import org.primefaces.context.RequestContext;

/**
 *
 * @author marcosdj
 */
@ManagedBean
@ViewScoped
public class SetorBean extends SetorRN implements Serializable {

    private Setor setor = new Setor();
    private Validator validator = new Validator();
    private List<Unidade> unidades;
    private List<Servidor> servidores;
    private String titulo;
    private List<Setor> setorUnidade;
    private Setor recebeSetorLista = new Setor();
    private UnidadeRN undRN = new UnidadeRN();

    public SetorBean() {
        this.titulo = "CADASTRAR SETOR";
        if (JsfUtil.getSession().getAttribute("UC") != null) {
            Object[] array = (Object[]) JsfUtil.getSession().getAttribute("UC");
            if (array[1] instanceof Setor) {
                this.setor = (Setor) array[1];
            }
            this.titulo = "ALTERAR CADASTRO DE SETOR";
        }

    }

    public String irCadSetor() {
        validator.verificaSessao();
        return "/sistema/setor/cadastro.xhtml?faces-redirect=true";
    }

    public String irLista() {
        validator.verificaSessao();
        return "/sistema/setor/lista.xhtml?faces-redirect=true";
    }

    public void alterar() throws IOException {
        FacesContext.getCurrentInstance().getExternalContext().redirect("cadastro.xhtml");
    }

    public void putInSession(Setor setor) throws Exception {
        SystemUtil.updateUseCase(setor, Setor.class);
    }

    public void verificaCamposDialog() {
        if (validarCampos()) {
            RequestContext.getCurrentInstance().addCallbackParam("flag", "salvar");
        } else {
            RequestContext.getCurrentInstance().update("formSetor");
        }
    }

    public void salvar() {
        if (JsfUtil.getSession().getAttribute("UC") == null) {
            setor.getUnidade().getSetorList().add(setor);
            undRN.edit(setor.getUnidade());
        } else {
            edit(setor);
        }
        setor = null;
        RequestContext.getCurrentInstance().addCallbackParam("flag", "ok");
        validator.verificaSessao();
    }

    public void cancelar() throws IOException {
        validator.verificaSessao();
        setor = new Setor();
        this.titulo = "CADASTRAR SETOR";
    }

    public boolean validarCampos() {
        boolean resposta = true;
        if (setor.getNome().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgNome",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Nome é obrigatório", ""));
            resposta = false;
        }

        if (setor.getSigla().trim().equals("")) {
            FacesContext.getCurrentInstance().
                    addMessage("msgSigla",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Sigla é obrigatório", ""));
            resposta = false;
        }

        if (setor.getResponsavel() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgResponsavel",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Responsável é obrigatório", ""));
            resposta = false;
        }
        
        if (setor.getResponsavel()!= null) {             
            if (validator.isResponsavel(setor.getResponsavel())) {
                FacesContext.getCurrentInstance().
                        addMessage("msgResponsavel",
                                new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Servidor já é responsável por alguma unidade ou setor", ""));
                resposta = false;

            }
        }

        if (setor.getUnidade() == null) {
            FacesContext.getCurrentInstance().
                    addMessage("msgUnidade",
                            new FacesMessage(FacesMessage.SEVERITY_ERROR, "O Campo Unidade é obrigatório", ""));
            resposta = false;
        }

        return resposta;
    }

    public String getTitulo() {
        return titulo;
    }

    public void setTitulo(String titulo) {
        this.titulo = titulo;
    }

    public Setor getSetor() {
        return setor;
    }

    public void setSetor(Setor setor) {
        this.setor = setor;
    }

    public List<Unidade> getUnidades() {
        if (unidades == null) {
            unidades = new UnidadeRN().obtainAll(Unidade.class);
        }
        return unidades;
    }

    public void selecionaSetorUnidade() {
        if (recebeSetorLista.getUnidade().getSetorList() != null) {
            setorUnidade = recebeSetorLista.getUnidade().getSetorList();
        }
    }

    public void setUnidades(List<Unidade> unidades) {
        this.unidades = unidades;
    }

    public List<Servidor> getServidores() {
        if (servidores == null) {
            servidores = new ServidorRN().obtainAll(Servidor.class);
        }
        return servidores;
    }

    public void setServidores(List<Servidor> servidores) {
        this.servidores = servidores;
    }

    public List<Setor> getSetorUnidade() {
        if (setorUnidade == null) {
            setorUnidade = obtainAll(Setor.class);
        }
        return setorUnidade;
    }

    public void setSetorUnidade(List<Setor> setorUnidade) {
        this.setorUnidade = setorUnidade;
    }

    public Setor getRecebeSetorLista() {
        return recebeSetorLista;
    }

    public void setRecebeSetorLista(Setor recebeSetorLista) {
        this.recebeSetorLista = recebeSetorLista;
    }

}
